package mr.ali.video.web.util;

import mr.ali.video.web.service.TencentCosService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 腾讯云COS工具类
 * 提供简便的方法来获取文件内容和地址
 */
@Component
public class TencentCosUtil {

    private static final Logger logger = LoggerFactory.getLogger(TencentCosUtil.class);

    @Autowired
    private TencentCosService tencentCosService;

    /**
     * 通过文件名获取文件内容和地址
     *
     * @param fileName 文件名（对象键）
     * @return 包含文件内容和地址的Map，如果文件不存在则返回null
     */
    public Map<String, Object> getFileContentAndUrl(String fileName) {
        try {
            // 检查文件是否存在
            if (!tencentCosService.doesFileExist(fileName)) {
                logger.warn("文件 {} 不存在", fileName);
                return null;
            }

            return tencentCosService.getFileContentAndUrl(fileName);
        } catch (Exception e) {
            logger.error("获取文件内容和地址失败: {}", e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 获取文件的临时访问URL
     *
     * @param fileName 文件名（对象键）
     * @return 文件的临时访问URL，如果文件不存在则返回null
     */
    public String getFileUrl(String fileName) {
        return getFileUrl(fileName, 3600); // 默认1小时有效期
    }

    /**
     * 获取文件的临时访问URL
     *
     * @param fileName 文件名（对象键）
     * @param expireTimeInSeconds URL有效期（秒）
     * @return 文件的临时访问URL，如果文件不存在则返回null
     */
    public String getFileUrl(String fileName, long expireTimeInSeconds) {
        try {
            // 检查文件是否存在
            if (!tencentCosService.doesFileExist(fileName)) {
                logger.warn("文件 {} 不存在", fileName);
                return null;
            }

            return tencentCosService.getFileUrl(fileName, expireTimeInSeconds);
        } catch (Exception e) {
            logger.error("获取文件URL失败: {}", e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 检查文件是否存在
     *
     * @param fileName 文件名（对象键）
     * @return 文件是否存在
     */
    public boolean doesFileExist(String fileName) {
        try {
            return tencentCosService.doesFileExist(fileName);
        } catch (Exception e) {
            logger.error("检查文件是否存在失败: {}", e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 获取文件内容的字节数组
     *
     * @param fileName 文件名（对象键）
     * @return 文件内容的字节数组，如果文件不存在则返回null
     */
    public byte[] getFileContent(String fileName) {
        try {
            // 检查文件是否存在
            if (!tencentCosService.doesFileExist(fileName)) {
                logger.warn("文件 {} 不存在", fileName);
                return null;
            }

            Map<String, Object> fileInfo = tencentCosService.getFileContentAndUrl(fileName);
            return (byte[]) fileInfo.get("content");
        } catch (Exception e) {
            logger.error("获取文件内容失败: {}", e.getMessage(), e);
            throw e;
        }
    }
}
